package com.atguigu.boot2;

import ch.qos.logback.core.db.DBHelper;
import com.atguigu.boot2.bean.Pet;
import com.atguigu.boot2.bean.User;
import com.atguigu.boot2.conf.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;


/**
 * @author 杨林
 * @create 2023-08-21 9:34 星期一
 * description:
 */

/**
 * 主程序类；也可称之为主配置类
 *      SpringBoot帮我们配置好了所有web开发的常见场景
 *      主程序所在的包及其下边所有的子包都会被扫描进来
 *          无需包扫描配置
 *      如果想要改变扫描路径，可以使用scanBasePackages属性定义扫描的基础包
 *   @SpringBootApplication 是一个合成注解，相当于@SpringBootConfiguration
 *                                             @EnableAutoConfiguration
 *                                              @ComponentScan
 *   这三个注解
 */
//@ComponentScan("")  //也可以使用这个注解进行包扫描，但是@SpringBootApplication这个注解中包含@ComponentScan("")，
    //@ComponentScan("")不能重复使用
//@SpringBootApplication(scanBasePackages = "com.atguigu")   //告诉springboot这是一个SpringBoot应用
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot2")
public class BootApplication {

    public static void main(String[] args) {
        
        //1、返回IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(BootApplication.class, args);
        
        //2、查看容器里的组件  （组件定义的名字）
        String[] beanDefinitionNames = run.getBeanDefinitionNames();

//        for (String beanDefinitionName : beanDefinitionNames) {
//            System.out.println(beanDefinitionName);
////            System.out.println(beanDefinitionName.length());
//        }
//        
//        //3、从容器中获取组件
//        Pet tom = run.getBean("tom", Pet.class);
//        System.out.println(tom);
//        
//        //如果如果@Configuration(proxyBeanMethods = true)  拿到的对象如下
//        //4、com.atguigu.boot2.conf.MyConfig$$EnhancerBySpringCGLIB$$3f33b61c@302edb74
//        //如果如果@Configuration(proxyBeanMethods = false)  拿到的对象如下
//        //com.atguigu.boot2.conf.MyConfig@10643593
//        MyConfig bean = run.getBean(MyConfig.class);
//        System.out.println(bean);
//        
//        //如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有，保持组件单实例
//        User user = bean.user01();
//        User user1 = bean.user01();
//        System.out.println(user == user1);   //true
//
//        System.out.println("------------------------");
//        
//        //@Configuration(proxyBeanMethods = false) 在这个配置下
//        User user01 = run.getBean("user01", User.class);
//        Pet per = user01.getPer();
//        System.out.println(per);
//
//        Pet tom1 = run.getBean("tom", Pet.class);
//        System.out.println(per == tom1);    //false
//
//        System.out.println("============================================");
//        //获取组件
//        String[] beanNamesForType = run.getBeanNamesForType(User.class);
//        for (String s : beanNamesForType) {
//            System.out.println(s);
//        }
//
//        DBHelper bean1 = run.getBean(DBHelper.class);
//        System.out.println(bean1);

//        boolean user01 = run.containsBean("user01");
//        System.out.println(user01);

//        boolean haha = run.containsBean("haha");
//        boolean hehe = run.containsBean("hehe");
//        System.out.println(haha);
//        System.out.println(hehe);

    }
    
}
